package com.jh.concurrent.question;

/**
 * @author JH_Wong
 * @projectName newforward
 * @title StaticThreadQuestion.java
 * @package com.jh.concurrent.question
 * @description 静态变量的多线程可见性问题（VIPQ群）
 * @date 2019-05-29 09:44
 */
public class StaticThreadQuestion {
    /**
     * 包不包装都没啥关系，但是下面说到了静态类型的包装类型拆箱和装箱原理有关，但是这个又说不过去了
     */
    private static boolean stop = false;
    /**
     * 1、如果是包装类型的话，sum++是能跳出循环的，感觉静态变量拆箱装箱后原理有关（拆箱装箱也会重新读取值）
     * 2、如果是普通int类型，两个都不能跳出循环（添加控制指令就会跳出）
     */
    private static int sum = 0;

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            // 问题就在于控制指令（if、while等）会让程序重新到内存里面读取值
            while (!stop) {
                sum++;
                //sum = 9;

                /**
                 * 加上这个sout，感觉机制类似于同步，会将对应的静态变量刷新一遍线程副本
                 */
                //System.out.println(1);

                /**
                 * 当类型为int的时候，如果只是sum++，因为cpu底层做了优化，不会去读取最新的值，
                 * 如果通过一个if判断（控制指令），它就会重新到内存里面读取值
                 */
                 if (sum > 0) {
                   //int x = 1;
                }
            }
            System.out.println("sum：" + sum);
        }).start();
        // 注释睡眠的话，不管上面的静态变量是不是包装类都是子线程可以结束循环的
        Thread.sleep(1000);
        stop = true;
    }
}
